diff -ru herrie-2.1-orig/herrie-2.1/src/config.c herrie-2.1-filters-orig/herrie-2.1/src/config.c
--- herrie-2.1-orig/herrie-2.1/src/config.c	2008-07-15 10:59:07.000000000 -0500
+++ herrie-2.1-filters-orig/herrie-2.1/src/config.c	2008-07-18 09:51:35.000000000 -0500
@@ -171,6 +171,8 @@
 	{ "scrobbler.username",		"",		NULL,		NULL },
 #endif /* BUILD_SCROBBLER */
 	{ "vfs.dir.hide_dotfiles",	"yes",		valid_bool,	NULL },
+        { "vfs.dir.hide_extfiles",      "no",           valid_bool,     NULL },
+        { "vfs.ext.whitelist",          "mp3 wav ogg",  NULL,           NULL },
 #ifdef G_OS_UNIX
 	{ "vfs.lockup.chroot",		"",		NULL,		NULL },
 	{ "vfs.lockup.user",		"",		NULL,		NULL },
diff -ru herrie-2.1-orig/herrie-2.1/src/playq.c herrie-2.1-filters-orig/herrie-2.1/src/playq.c
--- herrie-2.1-orig/herrie-2.1/src/playq.c	2008-07-15 10:59:07.000000000 -0500
+++ herrie-2.1-filters-orig/herrie-2.1/src/playq.c	2008-07-18 10:16:04.000000000 -0500
@@ -259,12 +259,20 @@
 		playq_repeat = 1;
 	}
 
+	/* Create and compile Whitelist regex */
+	vfs_create_whitelist(config_getopt("vfs.ext.whitelist"));
+
 	filename = config_getopt("playq.dumpfile");
 	if (load_dumpfile && filename[0] != '\0') {
 		/* Autoload playlist */
 		vr = vfs_lookup(filename, NULL, NULL, 0);
 		if (vr != NULL) {
-			vfs_unfold(&playq_list, vr);
+			if (config_getopt_bool("vfs.dir.hide_extfiles"))
+				vfs_unfold(&playq_list, vr, 1);
+			else {
+				/* Don't filter out files at this time */
+				vfs_unfold(&playq_list, vr, 0);
+			}
 			vfs_close(vr);
 		}
 	}
@@ -313,7 +321,7 @@
 	struct vfslist newlist = VFSLIST_INITIALIZER;
 
 	/* Recursively expand the item */
-	vfs_unfold(&newlist, vr);
+	vfs_unfold(&newlist, vr, 1);
 	if (vfs_list_empty(&newlist))
 		return;
 
@@ -336,7 +344,7 @@
 	struct vfslist newlist = VFSLIST_INITIALIZER;
 
 	/* Recursively expand the item */
-	vfs_unfold(&newlist, vr);
+	vfs_unfold(&newlist, vr, 1);
 	if (vfs_list_empty(&newlist))
 		return;
 
@@ -446,7 +454,7 @@
 	struct vfslist newlist = VFSLIST_INITIALIZER;
 
 	/* Recursively expand the item */
-	vfs_unfold(&newlist, nvr);
+	vfs_unfold(&newlist, nvr, 1);
 	if (vfs_list_empty(&newlist))
 		return;
 
@@ -468,7 +476,7 @@
 	struct vfslist newlist = VFSLIST_INITIALIZER;
 
 	/* Recursively expand the item */
-	vfs_unfold(&newlist, nvr);
+	vfs_unfold(&newlist, nvr, 1);
 	if (vfs_list_empty(&newlist))
 		return;
 
diff -ru herrie-2.1-orig/herrie-2.1/src/vfs.c herrie-2.1-filters-orig/herrie-2.1/src/vfs.c
--- herrie-2.1-orig/herrie-2.1/src/vfs.c	2008-07-15 10:59:07.000000000 -0500
+++ herrie-2.1-filters-orig/herrie-2.1/src/vfs.c	2008-07-18 10:10:18.000000000 -0500
@@ -185,6 +185,11 @@
 	return g_string_free(npath, FALSE);
 }
 
+struct vfsmatch * vfs_get_vm_whitelist()
+{
+	return vm_whitelist;
+}
+
 const char *
 vfs_lockup(void)
 {
@@ -245,6 +250,27 @@
 	g_slice_free(struct vfsent, ve);
 }
 
+void
+vfs_create_whitelist(const char* whitelist)
+{
+	char res[128] = "";
+	char *expr = "|[.]";
+	strcat(res, "[.]");
+
+	int i,j;
+	for (i=0,j=strlen(res); i < strlen(whitelist); i++) {
+		if (whitelist[i] == ' ') {
+			strcat(res, expr);
+			j+=strlen(expr);
+		}
+		else
+			res[j++] = whitelist[i];
+	}
+	res[j] = '\0';
+
+	vm_whitelist = vfs_match_new(res);
+}
+
 struct vfsref *
 vfs_lookup(const char *filename, const char *name, const char *basepath,
     int strict)
@@ -363,7 +389,7 @@
 }
 
 void
-vfs_unfold(struct vfslist *vl, const struct vfsref *vr)
+vfs_unfold(struct vfslist *vl, const struct vfsref *vr, int useWhiteList)
 {
 	struct vfsref *cvr;
 
@@ -374,8 +400,14 @@
 		/* See if we can recurse it */
 		vfs_populate(vr);
 		VFS_LIST_FOREACH(&vr->ent->population, cvr) {
-			if (cvr->ent->recurse)
-				vfs_unfold(vl, cvr);
+			if (cvr->ent->recurse) {
+				/* Ignore Whitelist if it is not valid
+				 * Make sure directories aren't filtered
+				 */
+				if (!useWhiteList || vm_whitelist == NULL || !vfs_playable(cvr) ||
+				   vfs_match_compare(vm_whitelist, vfs_filename(cvr)))
+					vfs_unfold(vl, cvr, useWhiteList);
+			}
 		}
 	}
 }
diff -ru herrie-2.1-orig/herrie-2.1/src/vfs.h herrie-2.1-filters-orig/herrie-2.1/src/vfs.h
--- herrie-2.1-orig/herrie-2.1/src/vfs.h	2008-07-15 10:59:07.000000000 -0500
+++ herrie-2.1-filters-orig/herrie-2.1/src/vfs.h	2008-07-18 09:59:21.000000000 -0500
@@ -164,11 +164,21 @@
 };
 
 /**
+ * @brief The compiled regex for the whitelist
+ */
+static struct vfsmatch                *vm_whitelist;
+
+/**
  * @brief Contents of an empty VFS list structure.
  */
 #define VFSLIST_INITIALIZER { NULL, NULL, 0 }
 
 /**
+ * @brief Returns the whitelist
+ */
+struct vfsmatch * vfs_get_vm_whitelist();
+
+/**
  * @brief Run-time initialize a VFS list structure.
  */
 static inline void
@@ -362,6 +372,14 @@
 const char	*vfs_lockup(void);
 
 /**
+ * @brief Create the compiled regex for the whitelist.
+ * The input string should be formatted similar to
+ * "ext1 ext2 ext3" and this will be converted into a 
+ * Regular Expr like "[.]ext1|[.]ext2|[.]ext3".
+ */
+void vfs_create_whitelist(const char* whitelist);
+
+/**
  * @brief Create a VFS reference from a filename. The name argument is
  *        optional. It only allows you to display entities with a
  *        different name (inside playlists). When setting the basepath
@@ -390,7 +408,7 @@
  * @brief Recursively expand a VFS reference to all their usable
  *        children and append them to the specified list.
  */
-void		vfs_unfold(struct vfslist *vl, const struct vfsref *vr);
+void            vfs_unfold(struct vfslist *vl, const struct vfsref *vr, int useWhiteList);
 /**
  * @brief Recursively search through a VFS reference and add all
  *        matching objects to a list. The VFS reference itself will be
diff -ru herrie-2.1-orig/herrie-2.1/src/vfs_regular.c herrie-2.1-filters-orig/herrie-2.1/src/vfs_regular.c
--- herrie-2.1-orig/herrie-2.1/src/vfs_regular.c	2008-07-15 10:59:07.000000000 -0500
+++ herrie-2.1-filters-orig/herrie-2.1/src/vfs_regular.c	2008-07-18 10:03:06.000000000 -0500
@@ -73,9 +73,13 @@
 	GDir *dir;
 	const char *sfn;
 	struct vfsref *nvr, *svr;
-	int hide_dotfiles;
+	struct vfsmatch *whitelist;
+	int hide_dotfiles, hide_extfiles;
 
 	hide_dotfiles = config_getopt_bool("vfs.dir.hide_dotfiles");
+	hide_extfiles = config_getopt_bool("vfs.dir.hide_extfiles");
+
+	whitelist = vfs_get_vm_whitelist();
 
 	if ((dir = g_dir_open(ve->filename, 0, NULL)) == NULL)
 		return (-1);
@@ -88,6 +92,11 @@
 		if ((nvr = vfs_lookup(sfn, NULL, ve->filename, 1)) == NULL)
 			continue;
 
+		/* Hide files (not directories) that are not whitelisted */
+		if (hide_extfiles && whitelist != NULL && vfs_playable(nvr) && 
+		   !vfs_match_compare(whitelist, vfs_filename(nvr)))
+			continue;
+
 		/*
 		 * Add the items to the tailq in a sorted manner.
 		 */
